package com.nintendo.controller;

import com.nintendo.config.MinioConfig;
import com.nintendo.entity.dto.UsersDTO;
import com.nintendo.entity.pojo.Users;
import com.nintendo.entity.vo.UsersVo;
import com.nintendo.enums.OperatorFriendRequestTypeEnum;
import com.nintendo.enums.SearchFriendsStatusEnum;
import com.nintendo.service.UsersService;
import com.nintendo.utils.FileUtils;
import com.nintendo.utils.IMoocJSONResult;
import com.nintendo.utils.MD5Utils;
import com.nintendo.utils.MinioUtils;
import org.apache.catalina.User;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@RestController
@RequestMapping("/u")
public class UserController {
    @Autowired
    private UsersService userService;
    @Autowired
    private MinioUtils minioUtils;
    @Autowired
    private MinioConfig minioConfig;

    @PostMapping("/registOrLogin")
    public IMoocJSONResult registerOrLogin(@RequestBody Users user) throws Exception {
        //0. 判断用户名和密码不能为空
        if (StringUtils.isBlank(user.getUsername()) || StringUtils.isBlank(user.getPassword())) {
            return IMoocJSONResult.errorMsg("用户名或密码不能为空...");
        }
        //1. 判断用户名是否存在 如果存在就登录  不存在就注册
        boolean usernameIsExist = userService.queryUsernameIsExist(user.getUsername());
        Users userResult = null;
        if (usernameIsExist) {
            //1.1 登录
            userResult = userService.queryUserForLogin(user.getUsername(), MD5Utils.getMD5Str(user.getPassword()));
            if (userResult == null) {
                return IMoocJSONResult.errorMsg("用户名或密码不正确...");
            }
        } else {
            //1.2 注册
            user.setNickname(user.getUsername());
            user.setFaceImage("");
            user.setFaceImageBid("");
            user.setPassword(MD5Utils.getMD5Str(user.getPassword()));
            userResult = userService.saveUser(user);
        }
        UsersVo usersVo = new UsersVo();
        BeanUtils.copyProperties(userResult, usersVo);
        return IMoocJSONResult.ok(usersVo);
    }

    @PostMapping("/uploadFaceBase64")
    public IMoocJSONResult uploadFaceImage(@RequestBody UsersDTO usersDTO) {
        // 获取前端传递过来的base64字符串 然后转换为文件对象在上传
        String base64Data = usersDTO.getFaceData();
        String userFacePath = "E:\\" + usersDTO.getUserId() + "userface64.png";
        Users users = new Users();
        try {
            FileUtils.base64ToFile(userFacePath, base64Data);
            MultipartFile faceFile = FileUtils.fileToMultipart(userFacePath);
            System.out.println("faceFile====>" + faceFile);
            String url = minioUtils.upload(faceFile);
            url = "http://" + minioConfig.getEndpoint() + ":" + minioConfig.getPort() + "/" + url;
            Users user = new Users();
            user.setId(usersDTO.getUserId());
            user.setFaceImage(url);
            user.setFaceImageBid(url);
            users = userService.updateUserInfo(user);
            return IMoocJSONResult.ok(users);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return IMoocJSONResult.ok(users);
    }

    @PostMapping("/setNickname")
    public IMoocJSONResult setNickname(@RequestBody UsersDTO usersDTO) {
        Users user = new Users();
        user.setId(usersDTO.getUserId());
        user.setNickname(usersDTO.getNickname());
        Users users = userService.updateUserInfo(user);
        return IMoocJSONResult.ok(users);
    }

    /**
     * 搜索好友接口, 这是根据账号做匹配查询 而不是模糊查询
     *
     * @param
     * @return
     */
    @PostMapping("/search")
    public IMoocJSONResult searchUser(String myUserId, String friendUsername) {
        // 0. 判断myUserId 和friendUsername 不能为空
        if (StringUtils.isBlank(myUserId) || StringUtils.isBlank(friendUsername)) {
            return IMoocJSONResult.errorMsg("");
        }
        // 前置条件 -1. 搜索的用户如果不存在 返回[无此用户]
        // 前置条件 -2. 搜索的用户如果是你自己 返回[不能添加自己为好友]
        // 前置条件 -3. 搜索的用户已经是你的好友 返回[该用户已经是你的好友]
        Integer status = userService.preconditionSearchFriends(myUserId, friendUsername);
        if (status == SearchFriendsStatusEnum.SUCCESS.status) {
            Users user = userService.queryUserInfoByUsername(friendUsername);
            UsersVo userVo = new UsersVo();
            BeanUtils.copyProperties(user, userVo);
            return IMoocJSONResult.ok(userVo);
        } else {
            return IMoocJSONResult.errorMsg(SearchFriendsStatusEnum.getMsgByKey(status));
        }
    }

    /**
     * 发送添加好友的请求
     *
     * @param myUserId
     * @param friendUsername
     * @return
     */
    @PostMapping("/addFriendRequest")
    public IMoocJSONResult addFriendRequest(String myUserId, String friendUsername) {
        // 0. 判断myUserId 和friendUsername 不能为空
        if (StringUtils.isBlank(myUserId) || StringUtils.isBlank(friendUsername)) {
            return IMoocJSONResult.errorMsg("");
        }
        // 前置条件 -1. 搜索的用户如果不存在 返回[无此用户]
        // 前置条件 -2. 搜索的用户如果是你自己 返回[不能添加自己为好友]
        // 前置条件 -3. 搜索的用户已经是你的好友 返回[该用户已经是你的好友]
        Integer status = userService.preconditionSearchFriends(myUserId, friendUsername);
        if (status == SearchFriendsStatusEnum.SUCCESS.status) {
            userService.sendFriendRequest(myUserId, friendUsername);
        } else {
            return IMoocJSONResult.errorMsg(SearchFriendsStatusEnum.getMsgByKey(status));
        }
        return IMoocJSONResult.ok();
    }

    @PostMapping("/queryFriendRequest")
    public IMoocJSONResult queryFriendRequest(String userId) {
        // 0. 判断userId不能为空
        if (StringUtils.isBlank(userId)) {
            return IMoocJSONResult.errorMsg("");
        }
        // 1. 查询用户接收到的好友申请
        return IMoocJSONResult.ok(userService.queryFriendRequestList(userId));
    }
    @PostMapping("/operFriendRequest")
    public IMoocJSONResult operFriendRequest(String acceptUserId, String sendUserId, Integer operType) {
        // 0. 判断acceptUserId sendUserId  operType 不能为空
        if (StringUtils.isBlank(acceptUserId)||StringUtils.isBlank(sendUserId)||operType==null) {
            return IMoocJSONResult.errorMsg("");
        }
        // 1. 如果operType没有对于的枚举
        if(StringUtils.isBlank(OperatorFriendRequestTypeEnum.getMsgByType(operType))){
            return IMoocJSONResult.errorMsg("");
        }
        if(operType == OperatorFriendRequestTypeEnum.IGNORE.type){
            //2. 判断如果忽略好友请求 直接删除好友请求的数据库记录
            userService.deleteFriendRequest(sendUserId,acceptUserId);
        }else if(operType==OperatorFriendRequestTypeEnum.PASS.type){
            //3. 判断如果是好友请求则互相增加好友记录到数据库对应的表
            userService.passFriendRequest(sendUserId,acceptUserId);
            // 然后删除好友请求的数据库记录
        }
        // 4. 数据库查询好友列表
        return IMoocJSONResult.ok(userService.queryMyFriends(acceptUserId));
    }
    @PostMapping("/myFriends")
    public IMoocJSONResult myFriends(String userId) {
        // 0. 判断acceptUserId sendUserId  operType 不能为空
        if (StringUtils.isBlank(userId)) {
            return IMoocJSONResult.errorMsg("");
        }
        // 1. 数据库查询好友列表
        return IMoocJSONResult.ok(userService.queryMyFriends(userId));
    }

}